"""
关键词提取工具
"""
import jieba
import jieba.analyse
from collections import Counter
from functools import lru_cache


# 停用词列表
STOP_WORDS = {
    '的', '了', '和', '是', '在', '有', '与', '及', '等', '对', '为', '从', '以', '或',
    '个', '能', '要', '可以', '进行', '工作', '负责', '完成', '具有', '熟悉', '掌握',
    '相关', '经验', '能力', '优先', '公司', '岗位', '职位', '任职', '要求', '资格',
    '职责', '描述', '内容', '主要', '包括', '负责', '参与', '协助', '支持', '配合',
}


@lru_cache(maxsize=128)
def extract_keywords_jieba(text, top_k=50):
    """
    使用jieba提取关键词（基于TF-IDF）
    
    Args:
        text: 文本内容
        top_k: 返回前K个关键词
    
    Returns:
        list: [(keyword, weight), ...]
    """
    if not text:
        return []
    
    # 使用jieba的TF-IDF算法提取关键词
    keywords = jieba.analyse.extract_tags(
        text,
        topK=top_k,
        withWeight=True,
        allowPOS=('n', 'v', 'vn', 'eng')  # 只保留名词、动词、英文
    )
    
    # 过滤停用词
    keywords = [(word, weight) for word, weight in keywords if word not in STOP_WORDS]
    
    return keywords


def extract_keywords_simple(text_list, top_k=50):
    """
    简单关键词提取（基于词频统计）
    
    Args:
        text_list: 文本列表
        top_k: 返回前K个关键词
    
    Returns:
        list: [(keyword, count), ...]
    """
    if not text_list:
        return []
    
    # 合并所有文本
    all_text = ' '.join([str(t) for t in text_list if t])
    
    # 分词
    words = jieba.cut(all_text)
    
    # 过滤停用词和短词
    words = [
        word for word in words
        if len(word) >= 2 and word not in STOP_WORDS
    ]
    
    # 统计词频
    counter = Counter(words)
    
    # 返回Top K
    return counter.most_common(top_k)


def extract_skills_from_job_descriptions(descriptions, top_k=50):
    """
    从职位描述中提取技能关键词
    
    Args:
        descriptions: 职位描述列表
        top_k: 返回前K个关键词
    
    Returns:
        dict: {
            'keywords': [(keyword, count), ...],
            'total_jobs': int
        }
    """
    if not descriptions:
        return {'keywords': [], 'total_jobs': 0}
    
    # 提取关键词
    keywords = extract_keywords_simple(descriptions, top_k=top_k)
    
    return {
        'keywords': [{'word': word, 'count': count} for word, count in keywords],
        'total_jobs': len(descriptions)
    }

